/*
 * @Author: KingOfLoach:469184621@qq.com
 * @Date: 2024-11-01 18:27:27
 * @LastEditors: 泥鳅王 469184621@qq.com
 * @LastEditTime: 2025-01-29 10:07:18
 * @FilePath: /LoachLogger/include/loach_tools.hpp
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
 */
#ifndef LOACH_TOOLS_HPP__
#define LOACH_TOOLS_HPP__

#ifdef WIN32 //Windows
    #include <direct.h>
    #include <io.h>
#else  // Linux
    // #include <sys/io.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <dirent.h>
#endif

#include <string>
#include <iostream>
#include "time.h"





/*******************************************
 * @description: 函数计时
 * @note:: 
 * @param  {func} 待运行函数
 * @return {float}返回一个float-> 函数运行时长
*******************************************/
#ifndef __FUNC_TIMER__
#define __FUNC_TIMER__(func) ({float res ; clock_t begin = clock() ; func;clock_t end = clock() ; (res) = (float)((float)(end-begin) / (CLOCKS_PER_SEC));})
#endif


namespace loach_tools{
    /**********************************************************
     * @description: 检查文件夹是否存在，不存在则创建
     * @note::  不支持递归检查创建 
     * @param {string} in_path : 文件夹地址
     * @return {*}
     *      : 0 文件夹存在
     *      : 1 文件夹不存在，创建文件夹成功
     *      : 2 文件夹不存在，创建文件夹失败
     ***********************************************************/
    int __CheckFolder__(std::string in_path);

    /**********************************************************
     * @description: 检查文件夹是否存在，不存在则创建
     * @note:: 支持递归检测与创建
     * @param {string} in_path
     * @param {int} p
     * @return {*}
     *      : 0 文件夹存在
     *      : 1 文件夹不存在，创建文件夹成功
     *      : 2 文件夹不存在，创建文件夹失败
    **********************************************************/
    int CheckFolder(std::string in_path,int p = 0,int dir_level = 0);

    /**
     * @description: 获取文件所在文件夹的路径
     * @param {string}   in_file_path
     * @return {string}  件所在文件夹的路径
     */
    std::string GetFileFolderPath(std::string in_file_path);
}

int loach_tools::__CheckFolder__(std::string in_path){
    if (access(in_path.c_str(), 0) == -1){
#ifdef WIN32
      int flag = mkdir(in_path.c_str());            //Windows创建文件夹
#else
      int flag = mkdir(in_path.c_str(), S_IRWXU);   //Linux创建文件夹
#endif
        if(flag == 0)   return 1;
        else            return 2;
    }
    return 0;
}

int loach_tools::CheckFolder(std::string in_path,int p,int dir_level){
    int err = 0;
    // 0. 递归终止条件
    if(p>=in_path.size())   return 0;
    // 1. 浮标右移，直到一层文件夹字符串结尾处
    while(in_path[p] != '/' && in_path[p] != '\\' && p<in_path.size()){
        p++;
    }
    // 2. 记录浮标指向文件夹层级数
    dir_level++;
    if(dir_level == 1) {
        p +=1;
        while(in_path[p] != '/' && in_path[p] != '\\' && p<in_path.size()){
            p++;
        }
        dir_level++;
    }
    // 3. check and creat folder
    err = __CheckFolder__(in_path.substr(0,p));
    if(err == 2) return err;    // ERR:: 递归终止
    // 4. recursion(递归)
    return CheckFolder(in_path,++p,dir_level);
}

std::string loach_tools::GetFileFolderPath(std::string in_file_path){
    
    int idx = 1;
    
    for(int i = in_file_path.size()-1;i>=0;--i){
        if (in_file_path[i] == '/' || in_file_path[i] == '\\'){
            idx = i;
            break;
        }
    }

    return in_file_path.substr(0,idx);
}

#endif